// 手机号验证
function telphone(rule, value, callback) {
  if (value === "") {
    callback();
    return;
  }
  const pass = /^(0[0-9]{2,3}-)?([2-9][0-9]{6,7})+(-[0-9]{1,4})?$/g.test(value);
  if (!pass) {
    callback(new Error(rule.message || "正确格式: 区号-电话号码 或 电话号码"));
  }
  callback();
}

// 电话号验证
function phone(rule, value, callback) {
  if (value === "") {
    callback(new Error(rule.message || "请输入电话号码"));
    return;
  }
  const pass = /^(\\+86)?0?[1][345789][0-9]{9}$/g.test(value);
  if (!pass) {
    callback(new Error(rule.message || "请输入正确的电话号码"));
  }
  callback();
}

// 身份证验证
function idNo(rule, value, callback) {
  if (value === "") {
    callback(new Error(rule.message || "请输入身份证号码"));
    return;
  }
  const pass = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])\d{3}([0-9]|X)$/g.test(value);
  if (!pass) {
    callback(new Error(rule.message || "请输入正确的身份证号码"));
  }
  callback();
}

// 邮箱验证
function email(rule, value, callback) {
  if (value === "") {
    callback();
    return;
  }
  const pass = /^[a-zA-Z0-9_.-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z0-9]{2,4}$/g.test(
    value
  );
  if (!pass) {
    callback(new Error(rule.message || "请输入正确的邮箱"));
  }
  callback();
}

// 6位数字验证
function postcode(rule, value, callback) {
  if (value === "") {
    callback();
    return;
  }
  const pass = /^\d{6}$/g.test(value);
  if (!pass) {
    callback(new Error(rule.message || "必须是6位数字"));
  }
  callback();
}

// 不能包含特殊字符验证
function notValidInputText(rule, value, callback) {
  if (value === "") {
    callback();
    return;
  }
  const pass = /^[^'/\\"()@$%^*<>&?]*$/g.test(value);
  if (!pass) {
    callback(new Error(rule.message || "不能包含特殊字符^'\\\"()@$%^*<>&?*"));
  }
  callback();
}

// 只能是数字验证
function isNumber(rule, value, callback) {
  if (value === "") {
    callback();
    return;
  }
  const pass = /^[0-9]*$/g.test(value);
  if (!pass) {
    callback(new Error(rule.message || "只能为数字"));
  }
  callback();
}

// ip地址验证
function ip(rule, value, callback) {
  if (value === "") {
    callback();
    return;
  }
  const pass =
    /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/g.test(
      value
    );
  if (!pass) {
    callback(new Error(rule.message || "请输入正确的ip地址"));
  }
  callback();
}

// 只能是数字和字母验证
function letterOrNumber(rule, value, callback) {
  if (value === "") {
    callback();
    return;
  }
  const pass = /^[0-9a-zA-Z]+$/g.test(value);
  if (!pass) {
    callback(new Error(rule.message || "只能是数字和字母"));
  }
  callback();
}

// 只能是数字和字母和_ 验证
function letterOrNumberorUl(rule, value, callback) {
  if (value === "") {
    callback();
    return;
  }
  const pass = /^\w+$/.test(value);
  if (!pass) {
    callback(new Error(rule.message || "只能是数字和字母和_"));
  }
  callback();
}

// 只能为 3-20 位字符串验证
function id(rule, value, callback) {
  if (value === "") {
    callback();
    return;
  }
  const pass = /^[a-zA-Z0-9-]{3,20}$/g.test(value);
  if (!pass) {
    callback(new Error(rule.message || "只能为 3-20 位字符串"));
  }
  callback();
}

// 必须是数字验证
function number(rule, value, callback) {
  if (value === "") {
    callback();
    return;
  }
  const pass = /^[0-9]{1,10}$/g.test(value);
  if (!pass) {
    callback(new Error(rule.message || "必须是数字"));
  }
  callback();
}

// 必须是非空正整数验证
function positiveNumberNotNull(rule, value, callback) {
  if (!value) {
    callback(new Error(rule.message || "不能为空"));
  }
  const pass = /^[0-9]\d*$/g.test(value);
  if (!pass) {
    callback(new Error(rule.message || "必须是正整数"));
  }
  callback();
}

// 必须是正整数验证
function positiveNumber(rule, value, callback) {
  if (!value) {
    callback();
    return;
  }
  const pass = /^[0-9]\d*$/g.test(value);
  if (!pass) {
    callback(new Error(rule.message || "必须是正整数"));
  }
  callback();
}

// 可输入正数负数和小数验证
function posiNactiveNumber(rule, value, callback) {
  if (value === "") {
    callback(new Error(rule.message || "不能为空"));
    return;
  }
  const pass = /^[+-]?\d+(\.\d+)?$/g.test(value);
  if (!pass) {
    // callback(new Error(rule.message || '可输入正数负数和小数'))
    callback(new Error("请输入整数或者小数"));
  }
  callback();
}

function tradePriceV(rule, value, callback) {
  if (!value) {
    return callback(new Error("进价不能为空"));
  }
  const pass = /^\d+(\.\d+)?$/g.test(value);
  if (!pass) {
    callback(new Error(rule.message || "只能输入数字"));
  }
  callback();
}

function retailPriceV(rule, value, callback) {
  if (!value) {
    return callback(new Error("售价不能为空"));
  }
  const pass = /^\d+(\.\d+)?$/g.test(value);
  if (!pass) {
    callback(new Error(rule.message || "只能输入数字"));
  }
  callback();
}

// 入库数量
function quantityNumber(rule, value, callback) {
  if (!value) {
    callback(new Error(rule.message || "入库数量不能为空"));
    return;
  }
  const pass = /^[0-9]\d*$/g.test(value);
  if (!pass) {
    callback(new Error(rule.message || "必须是正整数"));
  }
  callback();
}


/**
 * 密码强度验证
 * 密码长度不能少于8位，必须含有大小写字母、特殊符号、数字
 * @param {*} _rule
 * @param {*} value
 * @param {*} callback
 */
function quantityPassword(_rule, value, callback) {
  const pass = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,20}$/;
  if (value) {
    if (!pass || value.length < 8) {
      callback(new Error("密码长度不能少于8位，必须含有大小写字母、特殊符号、数字"));
    } else {
      callback();
    }
  } else {
    callback("请输入您的密码");
  }
}

function isPasswordStr(value) {
  if (value) {
    const pass = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,20}$/.test(value);
    if (!pass || value.length < 8) {
      return {
        "code": false,
        msg: "密码长度不能少于8位，必须含有大小写字母、特殊符号、数字"
      }
    } else {
      return {
        "code": true,
        msg: ""
      }
    }
  }
}

export {
  telphone,
  phone,
  email,
  postcode,
  notValidInputText,
  isNumber,
  ip,
  letterOrNumber,
  letterOrNumberorUl,
  id,
  number,
  positiveNumber,
  posiNactiveNumber,
  tradePriceV,
  retailPriceV,
  quantityNumber,
  idNo,
  positiveNumberNotNull,
  quantityPassword,
  isPasswordStr
}
